#ifndef TCP_SERVER
#define TCP_SERVER

#include <bits/stdc++.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

class tcpServer {
public:
    tcpServer() : m_listenfd(-1) , m_clientfd(-1) {};
    ~tcpServer() {};

    bool initServer(const unsigned short in_port) {
        
        m_port = in_port;
        
        // 第1步：创建服务端的socket。
        if ((m_listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { 
            std::cout << "m_listenfd socket error" << std::endl;
            return false; 
        }

        // 第2步：把服务端用于通信的地址和端口绑定到socket上。
        struct sockaddr_in servaddr;    // 服务端地址信息的数据结构。
        memset(&servaddr,0,sizeof(servaddr));
        servaddr.sin_family = AF_INET;  // 协议族，在socket编程中只能是AF_INET。
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);          // 任意ip地址。
        servaddr.sin_port = htons(in_port);  // 指定通信端口。
        
        //绑定服务器的IP地址和端口
        if (bind(m_listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0) { 
            perror("bind"); 
            m_listenfd = -1; 
            return false; 
        }
        
        // 第3步：把socket设置为监听模式。
        if (listen(m_listenfd, 5) != 0) { 
            perror("listen"); 
            m_listenfd = -1; 
            return -1; 
        }

    }

    bool acceptingConnections() {
        // 第4步：接受客户端的连接
        int socklen=sizeof(struct sockaddr_in); // struct sockaddr_in的大小
        struct sockaddr_in clientaddr;  // 客户端的地址信息。
        if((m_clientfd=accept(m_listenfd,(struct sockaddr *)&clientaddr,(socklen_t*)&socklen)) == -1) {
            return false;
        }
        //m_clientip = inet_ntoa(clientaddr.sin_addr);
        printf("客户端（%s）已连接。\n",inet_ntoa(clientaddr.sin_addr));
        return true;
    }

    bool sendMessage(const std::string &buffer) {
        if(m_clientfd == -1) {
            std::cout << "m_clientfd = -1" << std::endl;
            return false;
        }

        if(send(m_clientfd, buffer.data(), buffer.size(), 0) <= 0) {
            std::cout << "send < 0" << std::endl;
            return false;
        }

        return true;
    }

    bool recvMessage(std::string &buffer, const size_t &maxLen) {
        buffer.clear();
        buffer.resize(maxLen);

        int readn = recv(m_clientfd, &buffer[0], buffer.size(), 0);
        if(readn <= 0) {
            std::cout << "recv <= 0" << std::endl;
            buffer.clear();
            return false;
        }

        buffer.resize(readn);

        return true;
    }

public:
    int m_listenfd;     //监听socket
    int m_clientfd;     //客户端连接的socket
    std::string m_clientip;     //客户端的IP
    unsigned short m_port;      //客户端通信端口
};

#endif